在 Day 3 – Nuxt 3 核心功能概念(下) 有提到 Nuxt 3 是以 Nitro 做為 Server Engine,其中包含後端的 API 開發,透過 Auto Scan 的功能可以自動註冊下列三個資料夾的 API 以及支媛 HMR:
~/server/api
~/server/routes
~/server/middleware
以下就開始介紹使用方式。
首先確認 app.vue
有 <NuxtPage />
元件。
// app.vue
<template>
<NuxtPage />
</template>
檔案位置:server/api/
在 server/
建立 api/
資料夾,再建立 user.ts
檔案。
server
┣ api
┃ ┣ user.ts
在 server/api/user.ts
加入以下程式碼。
// server/api/user.ts
export default defineEventHandler((event) => {
return {
name: '安妮亞'
}
})
在 pages/
建立 getData.vue
檔案。
pages
┣ getData.vue
┣ index.vue
在 pages/getData.vue
加入以下程式碼。
// pages/getData.vue
<template>
<pre>{{ data }}</pre>
</template>
<script setup lang="ts">
const { data } = await useFetch('/api/user')
</script>
useFetch
是 Nuxt 3 提供的 composable
,用法跟 fetch
很像,後面幾天會再深入探討,敬請期待~
檢視結果:在 /getdata
頁面取得 api 結果。
server/routes/
server/api/
差別在於請求 url 時,不需要在前面加 /api
。pages/
差別在於此處 route 雖然也可以回傳 html 語法,但不會是一個完整的頁面,並且不支援跟 pages/
完全相同的功能。
Note that currently server routes do not support the full functionality of dynamic routes as pages do.。
在 server/
建立 routes/
資料夾,再建立 userRoute.ts
檔案。
server
┣ routes
┃ ┣ userRoute.ts
在 server/routes/userRoute.ts
加入以下程式碼。
// server/routes/userRoute.ts
export default defineEventHandler((event) => {
return {
name: '安妮亞',
favorite: 'peanuts'
}
})
修改 pages/getData.vue
程式碼。
// pages/getData.vue
<template>
<pre>{{ data }}</pre>
</template>
<script setup lang="ts">
const { data } = await useFetch('/userRoute')
</script>
檢視結果:在 /getdata
頁面取得 route 結果。
這時候就會有一個疑問,如果 pages/
的檔案跟 server/routes/
的檔案有相同路徑的檔案會發生什麼事?
先檢視請求 /userRoute
的畫面。
在 pages/
資料夾,新增 userRoute.vue
檔案。
nuxt-project
┣ pages
┃ ┗ userRoute.vue
在 pages/userRoute.vue
加入以下程式碼。
<template>
<h1>this is pages/userRoute.vue</h1>
</template>
再檢視請求 /userRoute
的畫面。
顯示的結果會是 server/routes/userRoute.ts
的結果!!
實際上,我們用 nuxt devtools
可以發現 pages/userRoute.vue
的頁面也是有被建立的。
透過 nuxt devtools
或 <NuxtLink to="userRoute"> go </NuxtLink>
的方式,請求 "/userRoute"
的畫面會是 pages/userRoute.vue
的頁面。
所以使用 server/routes/
時,需注意檔案路徑不要跟 pages/
相同,以免發生不可預期的狀況!
server/middleware/
server/api
及 server/routes
前執行在 server/middleware
的全部 middleware,且執行依據為檔案名稱的排序。在 server/
建立 middleware/
資料夾,再建立 auth.ts
檔案。
server
┣ middleware
┃ ┣ auth.ts
在 server/middleware/auth.ts
加入以下程式碼,設定 auth
。
// server/middleware/auth.ts
export default defineEventHandler((event) => {
event.context.auth = { name: "從 middleware 來的安妮亞" }
})
修改 server/api/user.ts
,將 return 的值改為 middleware 設定的 auth
。
// server/api/user.ts
export default defineEventHandler((event) => {
return {
name: event.context.auth.name,
}
})
請求 /api/user
的畫面。
今天介紹 Server API 的基本用法,明天會用實例介紹如何連接資料庫建立完整的 Restful API。